<template>
  <div class="todo-container">
    <div class="todo-wrap">
      <Header :addTodo="addTodo" />
      <fieldset>
        <legend>
          <span /> 代办事件：
        </legend>
        <List :todos="todos" :deleteTodo="deleteTodo" :checkedItem="checkedItem" />
      </fieldset>

      <Footer :todos="todos" :checkedAll="checkedAll" :clearChecked="clearChecked" />
    </div>
  </div>
</template>

<script lang='ts'>
import {
  defineComponent,
  reactive,
  toRefs,
  provide,
  onMounted,
  watch
} from "vue";
import Header from "./views/Header.vue";
import List from "./views/List.vue";
import Footer from "./views/Footer.vue";

// 引入接口 规范数据类型
import { Todo } from "./interface/Todos";
import { SaveTodo, ReadTodo } from "./util/todoUtils";
export default defineComponent({
  components: { Header, List, Footer },

  setup() {
    // 约束类型
    // state的todo为Todo类型的数组
    // const state = reactive<{ todos: Todo[] }>({
    //   todos: [
    //     {
    //       id: 1,
    //       title: "鬼剑士",
    //       isChecked: false
    //     },
    //     {
    //       id: 2,
    //       title: "圣职者",
    //       isChecked: true
    //     },
    //     {
    //       id: 3,
    //       title: "神枪手",
    //       isChecked: false
    //     }
    //   ]
    // });
    //
    // 约束类型
    // state的todo为Todo类型的数组
    const state = reactive<{ todos: Todo[] }>({ todos: [] });

    // 页面加载完成 200ms后获取数据
    onMounted(() => {
      setTimeout(() => {
        state.todos = ReadTodo();
      }, 200);
    });

    // 监听到todos变化，更新本地localStorage存储的数据

    // 正常写法
    // 有冗余代码
    // watch(
    //   () => state.todos,
    //   val => {
    //     SaveTodo(val);
    //   },
    //   { deep: true }
    // );

    // 简化后写法
    watch(() => state.todos, SaveTodo, { deep: true });

    // 定义添加的方法
    const addTodo = (todo: Todo) => {
      state.todos.unshift(todo);
    };

    // 定义删除的方法
    const deleteTodo = (id: number) => {
      state.todos = state.todos.filter(item => item.id != id);
    };

    //  修改某项的选中状态
    const checkedItem = (todo: Todo, isChecked: boolean) => {
      todo.isChecked = isChecked;
      console.log("修改某个对象的选中态", state.todos);
    };

    // 全选 | 取消全选
    const checkedAll = (isChecked: boolean) => {
      state.todos.map(item => {
        item.isChecked = isChecked;
      });
    };

    // 清理选中
    const clearChecked = () => {
      state.todos = state.todos.filter(item => !item.isChecked);
    };

    // 数据都维护在app组件内，最好将修改数据的行为也统一维护在app内
    return {
      ...toRefs(state),
      addTodo,
      deleteTodo,
      checkedItem,
      checkedAll,
      clearChecked
    };
  }
});
</script>

<style lang="scss">
.todo-container {
  margin: 10px auto;
  width: 600px;
  .todo-wrap {
    padding: 10px 10px 0 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
  }
}
</style>
